#ifndef INPUT_PARAL_FUN_MR_H
#define INPUT_PARAL_FUN_MR_H

#include "paral_py.h"
// 这个头文件用来解析并行函数里面的内容，继承了函数表
// 最终的目标是生成对应代码的语法树

// 做下列定义：
// 变量：以字母开头，接收除了空格和换行之外的任何符号
// 自定义二元操作符：函数表中的串行算子
// 自带二元操作符：仅支持 =

// 使用括号来规定优先级，碰到括号"("会递归执行一个语法树的生成程序
// 并直接得到一个语法树的根
// 碰到")"之后会直接完成分析，并且返回当前生成的语法树的跟

// 还有数字常量

// 一元计算符要用括号包好， 要不就会出现两个运算符连续出现的bug

// token类型
enum paral_py_language_token
{
    // 首先是变量
    paral_py_language_tok_var = -1,

    // 其次是运算符
    paral_py_language_tok_op = -2,

    // eof
    paral_py_language_tok_eof = -3,

    // 语法相关的token，比如def、if等
    paral_py_language_tok_gramma = -6,

    // tab的检测
    paral_py_language_tok_tab = -7,

    // 检测出未知
    paral_py_language_tok_unknow = -8
};

struct input_paral_MR_context
{
    std::string identifier_str;

    // 用一个字符串保存完整的整个函数
    std::string function_str;
    // 遍历的位置
    int function_str_index;

    // 用一个变量存储tab的数量
    int tab_size;

    // 从之前继承过来的函数表，查看对应的串行算子
    std::map<std::string, struct function_table_item> fun_table;

    // 用一个数字记录一个保留字
    std::vector<std::string> remain_str_arr;
};

// 用一个结构体存储paral_py的所有语元的基本信息
struct paral_py_tok_basic_info{
    std::string tok_str;
    int paral_py_token_type;
};

// 初始化并行算子分析的上下文
void init_input_paral_MR_context(struct input_paral_MR_context *mr_ctx,
                                 std::string fun_str, struct paral_py_context *ctx);

// 从字符串中获取一个字符
char get_char(struct input_paral_MR_context *mr_ctx);

// 根据token号打印
void print_token_of_input_paral_fun_MR(int type);

// 打印一个完整的paral_py_tok_basic_info
void print_paral_py_tok_basic_info(struct paral_py_tok_basic_info info);

// 从字符串中获取一个token，返回token类型
int get_token_of_input_paral_fun_MR(struct input_paral_MR_context *mr_ctx);

// 打印语元数组中的所有语元，只有操作符和变量两种类型
void print_paral_py_express_token_arr(std::vector<struct paral_py_tok_basic_info> arr);

struct pre_process_report input_paral_pre_analysis(std::vector<std::vector<struct paral_py_tok_basic_info>> all_code_token);
#endif